<?php
require_once 'Request/DateTime.php';
require_once 'Session.php';
require_once 'DateMath.php';
require_once APPLICATION_PATH . '/models/justice/xml/justice_xml.php';

class IndexController extends Zend_Controller_Action
{
	/** ＨＴＴＰリクエスト*/
	protected $_objRequest;
	/** セッションオブジェクト：登録データ */
	protected $_sessionForRegist;
	/** セッションオブジェクト：編集認証 */
	protected $_sessionForEditAuth;
	/** iPhoneフラグ*/
	protected $_flgIphone = FALSE;

	/** エラーメッセージマップ */
	public  static $arrErrMessageMap = array(
			self::VALUE_ERROR_USER_DUPULICATE=>'入力したパスワードはご利用になれません。',
			self::VALUE_ERROR_EDIT_AUTH => '入力のインターネットネームとパスワードのユーザー情報はありません。',
			self::VALUE_ERROR_LIMIT_AGE=>'未成年者は当システムをご利用になる必要はございません。',
	);

	/** 制限年齢 */
	const VALUE_LIMIT_AGE = 20;
	/** セッションキー：登録値配列 */
	const KEY_SESSION_VALUES = 'VALUES';
	/** セッションキー：編集認証 */
	const KEY_SESSION_EDIT_AUTH = 'EDIT_AUTH';
	/** リクエストキー：変更フラグ */
	const KEY_REQUEST_MODIFY = 'MODIFY';
	/** リクエストキー：エラー */
	const KEY_REQUEST_ERROR = 'ERR';
	/** ユーザー重複エラー */
	const VALUE_ERROR_USER_DUPULICATE = 'E01';
	/** 編集認証エラー */
	const VALUE_ERROR_EDIT_AUTH = 'E02';
	/** 年齢制限エラー */
	const VALUE_ERROR_LIMIT_AGE = 'E03';
	/** 自己ＵＲＬ確認遷移目的 */
	const VALUE_PURP_LOOK_URL = 'LOOK_URL';
	
		public function init()
		{
				/* Initialize action controller here */
			$this->_objRequest = new Lib_Request();
			$this->_objRequest->ValidRequireList = array(
//					models_justice::KEY_ID,
					models_justice::KEY_REKI,
					models_justice::KEY_NEN,
					models_justice::KEY_TUKI,
					models_justice::KEY_HI,
					models_justice::KEY_INAME,
					models_justice::KEY_PASSWORD,
			);
			/*** セッションインスタンス */
			$this->_sessionForRegist = new Lib_Session('regist');
			$this->_sessionForEditAuth = new Lib_Session('auth');
			
			/*** iPhone判定 */
			if((strpos($_SERVER['HTTP_USER_AGENT'],'iPhone')!==false)||(strpos($_SERVER['HTTP_USER_AGENT'],'iPod')!==false)) {
				$this->_flgIphone = TRUE;
			}
		}

		public function indexAction()
		{
				// action body
		}

		/**
		 * 個人情報入力画面
		 */
		public function inputAction()
		{
			/*** データセッションが保存されている場合、データセッションを優先する */
			if (is_array($this->_sessionForRegist->getValue(self::KEY_SESSION_VALUES))) {
				$_REQUEST = array_merge($_REQUEST, $this->_sessionForRegist->getValue(self::KEY_SESSION_VALUES));
				$this->_sessionForRegist->clear();
			}
			
			$this->view->modify = FALSE;
			/*** MODIFY URL 判定 */
			if (strpos($_SERVER["REQUEST_URI"], 'modify/') !== FALSE) {
				$this->view->modify = TRUE;
				$objDataset = new models_justice_xml();
				$id = $this->_objRequest->get(models_justice::KEY_ID);
				if ($id == '') {
					$id = $objDataset->createId($this->_objRequest->get(models_justice::KEY_INAME), 
							$this->_objRequest->get(models_justice::KEY_PASSWORD));
				}
				$dataset = $objDataset->searchId($id);
				/**認証判定 */
				if ($dataset !== FALSE) {
					$_REQUEST = array();
					$_REQUEST = $dataset;
					$this->view->lastUpdate = date('Y年n月j日　H:i:s', $_REQUEST[models_justice::KEY_MODIFYTIME]);
					$this->view->urlForSns = 'http://'.$_SERVER['HTTP_HOST'].Bootstrap::BASE_PATH.'/'.$id;
				} else {
					$this->_sessionForEditAuth->setValue(self::KEY_SESSION_EDIT_AUTH, $_REQUEST);
					$this->_redirect('/auth?'. self::KEY_REQUEST_ERROR . '=' . self::VALUE_ERROR_EDIT_AUTH);
					exit;
				}
			}
			
			$this->view->objReq = $this->_objRequest;
			$this->view->iname = $this->_objRequest->get(models_justice::KEY_INAME);
			$this->view->error_message_map = self::$arrErrMessageMap;
			$this->view->flgIphone = $this->_flgIphone;
		}

		/**
		 * 個人情報登録確認画面
		 * 未入力エラーはjavascriptで確認済みのため
		 * ここでの未入力エラーは致命的エラーに遷移
		 */
		public function confirmAction()
		{
			$ret = $this->_objRequest->valid();
			/*** リクエストバリデーション判定 */
			if ($ret === FALSE) {
				$this->_redirect('/error');
				exit;
			}
			$this->view->objReq = $this->_objRequest;
			$this->_sessionForRegist->setValue(self::KEY_SESSION_VALUES, $_REQUEST);
			$this->view->objSession = $this->_sessionForRegist;
			/*** 年齢算出 */
			$age = $this->_convBirthToAge();
			/*** 年齢制限判定 */
			if ($age < self::VALUE_LIMIT_AGE) {
				$this->_redirect('/input?err='.self::VALUE_ERROR_LIMIT_AGE);
				exit;
			}
			$objDataset = new models_justice_xml();
			/*** 重複登録判定 */
			if ($objDataset->isUserExists($this->_objRequest->get(models_justice::KEY_INAME), $this->_objRequest->get(models_justice::KEY_PASSWORD))) {
				/*** 新規登録は重複不可 */
				if ($this->_objRequest->get(self::KEY_REQUEST_MODIFY) != '1') {
					$this->_redirect('/input?err='.self::VALUE_ERROR_USER_DUPULICATE);
					exit;
				}
			} else {
				/*** 変更は非重複不可 */
				if ($this->_objRequest->get(self::KEY_REQUEST_MODIFY) == '1') {
					$this->_redirect('/error');
					exit;
				}
			}
		}

		/**
		 * 照会画面
		 */
		public function showAction()
		{
			$id = '';
			/*** 短縮URL判定 */
			if (strpos('/show', $_SERVER['REQUEST_URI']) === FALSE) {
				$div = explode('?', $_SERVER['REQUEST_URI']);
				$id = str_replace('/', '', $div[0]);
			} else {
				$id = $this->_objRequest[models_justice::KEY_ID];
			}
			
			$objDataset = new models_justice_xml();
			$aryUser = $objDataset->searchId($id);
			$this->view->iname = $aryUser[models_justice::KEY_INAME];
		}
		
		/**
		 * 削除完了画面
		 */
		public function deleteAction()
		{
			$objDataset = new models_justice_xml();
			$myId = $objDataset->createId($this->_objRequest->get(models_justice::KEY_INAME), $this->_objRequest->get(models_justice::KEY_PASSWORD));
			/**パスワード認証 */
			if ($myId != $this->_objRequest->get(models_justice::KEY_ID)) {
				$this->_redirect('/error');
				exit();
			}
			$ret = $objDataset->delelte($myId);
			if ($ret === FALSE) {
				$this->_redirect('/error');
				exit();
			}
			$ret = $objDataset->saveToFile();
			if ($ret === FALSE) {
				$this->_redirect('/error');
				exit();
			}
			$this->view->objReq = $this->_objRequest;
		}
		
		/**
		 * 登録完了画面
		 * リクエストエラーは確認画面で判定済みのため
		 * ここでのエラーは致命的エラーに遷移
		 */
		public function registAction()
		{
			$replaceFlg = false;
			if ($this->_objRequest->get(self::KEY_REQUEST_MODIFY) != '') {
				$replaceFlg = TRUE;
			}
			/***HTTPリクエストをいったん保存し、セッションと置き換える */
			$save_REQUEST = $_REQUEST;
			$_REQUEST = array();
			$_REQUEST = $this->_sessionForRegist->getValue(self::KEY_SESSION_VALUES);
			/*** 必須パラメータ判定 */
			if ($this->_objRequest->valid() === FALSE) {
				$this->_ridirect('/error');
				exit;
			}

			$objDataset = new models_justice_xml();
			/*** 重複登録判定 */
			if ($objDataset->isUserExists($this->_objRequest->get(models_justice::KEY_INAME), $this->_objRequest->get(models_justice::KEY_PASSWORD))) {
				// 追加登録時の重複はエラー
				if ($replaceFlg === FALSE) {
					$this->_redirect('/error');
					exit;
				}
			} else {
				// 変更時の変更対象無し判定
				if ($replaceFlg === TRUE) {
					$this->_redirect('/error');
					exit;
				}
			}

			/** 登録データ設置 */
			$reki = $_REQUEST[models_justice::KEY_REKI];
			$nen = $_REQUEST[models_justice::KEY_NEN];
			$tuki = $_REQUEST[models_justice::KEY_TUKI];
			$hi = $_REQUEST[models_justice::KEY_HI];
			$gakko = $_REQUEST[models_justice::KEY_GAKKO];
			$iname = $_REQUEST[models_justice::KEY_INAME];
			$password = $_REQUEST[models_justice::KEY_PASSWORD];
			$id = $objDataset->createId($iname, $password);
			/*** 追加変更分岐 */
			if ($replaceFlg === FALSE) {
				$ret = $objDataset->add($id, $reki, $nen, $tuki, $hi, $gakko, $iname, $password);
				// エラー判定
				if ($ret === FALSE) {
					$this->_redirect('/error');
					exit;
				}
			} else {
				$ret = $objDataset->replace($id, $reki, $nen, $tuki, $hi, $gakko, $iname, $password);
				// エラー判定
				if ($ret === FALSE) {
					$this->_redirect('/error');
					exit;
				}
			}
			$ret = $objDataset->saveToFile();
			if ($ret === FALSE) {
				$this->_redirect('/error');
				exit;
			}
			
			$this->view->objReq = $this->_objRequest;
			/*** 保存リクエスト復帰 */
			$_REQUEST = $save_REQUEST;
			
			$this->view->urlForSns = 'http://'.$_SERVER['HTTP_HOST'].Bootstrap::BASE_PATH.'/'.$id;
		}
		
		/**
		 * データ変更のための認証画面
		 */
		public function authAction()
		{
			/*** ＵＲＬ確認遷移判定 */
			$divideUrl = explode('?', $_SERVER["REQUEST_URI"]);
			$this->view->purp = '';
			if (substr($divideUrl[0], 0-strlen('/conf'), strlen('/conf')) == '/conf') {
				$this->view->purp = self::VALUE_PURP_LOOK_URL;
			}
			$authRequest = $this->_sessionForEditAuth->getValue(self::KEY_SESSION_EDIT_AUTH);
			if (is_array($authRequest)) {
				$_REQUEST = array_merge($_REQUEST, $authRequest);
				$this->_sessionForEditAuth->clear();
			}
			$this->view->objReq = $this->_objRequest;
		}
		
		/**
		 * ＵＲＬ確認画面
		 */
		public function lookAction()
		{
			$objDataset = new models_justice_xml();
			/**認証判定 */
			if ($objDataset->isUserExists($this->_objRequest->get(models_justice::KEY_INAME), $this->_objRequest->get(models_justice::KEY_PASSWORD)) === TRUE) {
			} else {
				$this->_sessionForEditAuth->setValue(self::KEY_SESSION_EDIT_AUTH, $_REQUEST);
				$this->_redirect('/conf?'. self::KEY_REQUEST_ERROR . '=' . self::VALUE_ERROR_EDIT_AUTH);
				exit;
			}
			$id = $objDataset->createId($this->_objRequest->get(models_justice::KEY_INAME), $this->_objRequest->get(models_justice::KEY_PASSWORD));
			$this->view->urlForSns = 'http://'.$_SERVER['HTTP_HOST'].Bootstrap::BASE_PATH.'/'.$id;
		}
		
		/**
		 * トップメニュー画面
		 */
		public function topAction()
		{
			
		}
		
		/**
		 *  投稿用URL表示画面
		 */
		public function showurlAction()
		{
			$id = $this->_objRequest->get(models_justice::KEY_ID);
			/*** 想定外導線判定 */
			if ( $id == '' ) {
				$this->_redirect('/error');
				exit();
			}
			$this->_sessionForRegist->clear(self::KEY_SESSION_VALUES);
			$this->_sessionForRegist->setValue(self::KEY_SESSION_VALUES, $_REQUEST);
			$this->view->id = $id;
		}
		
		/**
		 * リクエストパラメータの生年月日から年齢を算出する
		 */
		protected function _convBirthToAge()
		{
			switch ($this->_objRequest->get(models_justice::KEY_REKI)) {
				case DateMath::NENGO_MEIJI:
				case DateMath::NENGO_TAISHOU:
				case DateMath::NENGO_SHOUWA:
				case DateMath::NENGO_HEISEI:
					$aryResult = DateMath::convertSeireki1(
						$this->_objRequest->get(models_justice::KEY_REKI), 
						$this->_objRequest->get(models_justice::KEY_NEN));
					$seireki= $aryResult[DateMath::KEY_YEAR];
					break;
				default:
					$seireki = $this->_objRequest->get(models_justice::KEY_NEN);
					break;
			}
			$age = DateMath::convBirthToAge(
					$seireki, 
					$this->_objRequest->get(models_justice::KEY_TUKI), 
					$this->_objRequest->get(models_justice::KEY_HI));
			return $age;
		}
		
}

